home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / E / PsiloPlayer / Src / Modules / med / reloc.a < prev    next >
Encoding:
Text File  |  1995-11-23  |  3.6 KB  |  170 lines

  1. ; A small reloc routine for those who include the module directly in
  2. ; the program code.
  3.  
  4. ; NOTE: The module pointer is passed in register A0. Use stubs with
  5. ;    C.
  6.  
  7.         SECTION    "text",code
  8.  
  9.         XDEF    relocModule__i
  10.  
  11. mmd_songinfo    EQU    8
  12. mmd_blockarr    EQU    16
  13. mmd_expdata    EQU    32
  14. mmd_songsleft    EQU    51
  15. msng_numblocks    EQU    504
  16. msng_pseqs    EQU    508
  17. msng_numsamples    EQU    787
  18.  
  19. reloci        move.l    24(a2),d0
  20.         beq.s    xloci
  21.         movea.l    d0,a0
  22.         moveq   #0,d0
  23.         move.b  msng_numsamples(a1),d0    ;number of samples
  24.         subq.b  #1,d0
  25. relocs        bsr.s   relocentr
  26.         move.l    -4(a0),d3    ;sample ptr
  27.         beq.s    nosyn
  28.         move.l    d3,a3
  29.         tst.w    4(a3)
  30.         bpl.s    nosyn        ;type >= 0
  31.         move.w    20(a3),d2    ;number of waveforms
  32.         lea    278(a3),a3    ;ptr to wf ptrs
  33.         subq.w    #1,d2
  34. relsyn        add.l    d3,(a3)+
  35.         dbf    d2,relsyn
  36. nosyn        dbf     d0,relocs
  37. xloci        rts
  38. norel        addq.l    #4,a0
  39.         rts
  40. relocentr    tst.l   (a0)
  41.         beq.s   norel
  42.         add.l   d1,(a0)+
  43.         rts
  44.  
  45. relocModule__i    move.l    4(sp),a0
  46.         movem.l    a2-a4/d2-d4,-(sp)
  47.         movea.l a0,a2
  48.         move.l  a2,d1        ;d1 = ptr to start of module
  49.         bsr.s    relocp
  50.         movea.l mmd_songinfo(a2),a1
  51.         bsr.s    reloci
  52.         move.b    mmd_songsleft(a2),d4
  53. rel_lp        bsr.s    relocb
  54.         cmp.b    #'2',3(a2)    ;MMD2?
  55.         bne.s    norelmmd2
  56.         bsr.w    relocmmd2sng
  57. norelmmd2    move.l    mmd_expdata(a2),d0    ;extension struct
  58.         beq.s    rel_ex
  59.         move.l    d0,a0
  60.         bsr.s    relocentr    ;ptr to next module
  61.         bsr.s    relocentr    ;InstrExt...
  62.         addq.l    #4,a0        ;skip sizes of InstrExt
  63. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  64. ; read them.
  65.         bsr.s    relocentr    ;annotxt
  66.         addq.l    #4,a0        ;annolen
  67.         bsr.s    relocentr    ;InstrInfo
  68.         addq.l    #8,a0
  69.         bsr.s    relocentr    ;rgbtable (not useful for most people)
  70.         addq.l    #4,a0        ;skip channelsplit
  71.         bsr.s    relocentr    ;NotationInfo
  72.         bsr.s    relocentr    ;songname
  73.         addq.l    #4,a0        ;skip song name length
  74.         bsr.s    relocentr    ;MIDI dumps
  75.         bsr.s    relocmdd
  76.         subq.b    #1,d4        ;songs left..?
  77.         bcs.s    rel_ex
  78.         move.l    d0,a0
  79.         move.l    (a0),d0
  80.         beq.s    rel_ex
  81.         move.l    d0,a2
  82.         bsr.s    relocp
  83.         movea.l 8(a2),a1
  84.         bra.s    rel_lp
  85. rel_ex        movem.l    (sp)+,d2-d4/a2-a4
  86.         rts
  87.  
  88. relocp        lea    mmd_songinfo(a2),a0
  89.         bsr.s    relocentr
  90.         addq.l    #4,a0
  91.         bsr.s    relocentr
  92.         addq.l    #4,a0
  93.         bsr.s    relocentr
  94.         addq.l    #4,a0
  95.         bra.s    relocentr
  96.  
  97. relocb        move.l    mmd_blockarr(a2),d0
  98.         beq.s    xlocb
  99.         movea.l    d0,a0
  100.         move.w  msng_numblocks(a1),d0
  101.         subq.b  #1,d0
  102. rebl        bsr    relocentr
  103.         dbf     d0,rebl
  104.         cmp.b    #'T',3(a2)    ;MMD0 (= MCNT)
  105.         beq.s    xlocb
  106.         cmp.b    #'1',3(a2)    ;test MMD type
  107.         bge.s    relocbi
  108. xlocb        rts
  109.  
  110. relocmdd    move.l    d0,-(sp)
  111.         tst.l    -(a0)
  112.         beq.s    xlocmdd
  113.         movea.l    (a0),a0
  114.         move.w    (a0),d0        ;# of msg dumps
  115.         addq.l    #8,a0
  116. mddloop        beq.s    xlocmdd
  117.         bsr    relocentr
  118.         bsr.s    relocdmp
  119.         subq.w    #1,d0
  120.         bra.s    mddloop
  121. xlocmdd        move.l    (sp)+,d0
  122.         rts
  123.  
  124. relocdmp    move.l    -4(a0),d3
  125.         beq.s    xlocdmp
  126.         exg.l    a0,d3        ;save
  127.         addq.l    #4,a0
  128.         bsr    relocentr    ;reloc data pointer
  129.         move.l    d3,a0        ;restore
  130. xlocdmp        rts
  131.  
  132. relocbi        move.w    msng_numblocks(a1),d0
  133.         move.l    a0,a3
  134. biloop        subq.w    #1,d0
  135.         bmi.s    xlocdmp
  136.         move.l    -(a3),a0
  137.         addq.l    #4,a0
  138.         bsr    relocentr    ;BlockInfo ptr
  139.         tst.l    -(a0)
  140.         beq.s    biloop
  141.         move.l    (a0),a0
  142.         bsr    relocentr    ;hldata
  143.         bsr    relocentr    ;block name
  144.         addq.l    #4,a0        ;skip blocknamelen
  145.         bsr    relocentr    ;pagetable
  146.         tst.l    -(a0)
  147.         bne.s    relocpgtbl
  148.         bra.s    biloop
  149. ; take care of the new features of MMD2s
  150. relocmmd2sng    move.l    mmd_songinfo(a2),a0
  151.         lea    msng_pseqs(a0),a0
  152.         bsr    relocentr    ;playseqtable
  153.         bsr    relocentr    ;sectiontable
  154.         bsr    relocentr    ;trackvols
  155.         move.w    2(a0),d0    ;numpseqs
  156.         move.l    -12(a0),a0    ;get back to playseqtable
  157.         subq.w    #1,d0
  158. psqtblloop    bsr    relocentr
  159.         dbf    d0,psqtblloop
  160.         rts
  161. relocpgtbl    movea.l    (a0),a4        ;page table list hdr
  162.         move.w    (a4),d2
  163.         subq.w    #1,d2
  164.         lea    4(a4),a0
  165. pgtblloop    bsr    relocentr
  166.         dbf    d2,pgtblloop
  167.         bra    biloop
  168.  
  169.         END
  170.